

/** json格式  **/
jQuery.extend( {
  evalJSON : function (strJson) {
    return eval( "(" + strJson + ")");
  }
});
jQuery.extend( {
  toJSON : function (object) {
    if(null==object)return "null";
    var type = typeof object;
    if ('object' == type) {
      if (Array == object.constructor) type = 'array';
      else if (RegExp == object.constructor) type = 'regexp';
      else type = 'object';
    }
    switch(type) {
      case 'undefined': case 'unknown':
        return;
        break;
      case 'function':
      case 'boolean':
      case 'regexp':
        return object.toString();
        break;
      case 'number':
        return isFinite(object) ? object.toString() : 'null';
        break;
      case 'string':
        return '"' + object.replace(/(\\|\")/g,"\\$1").replace(/\n|\r|\t/g, function(){
          var a = arguments[0];
          return (a == '\n') ? '\\n': (a == '\r') ? '\\r': (a == '\t') ? '\\t': ""
        }) + '"';
        break;
      case 'object':
        if (object === null) return 'null';
        var pp="";
        var value ="";
        try{
          var results = [];
          for (var property in object) {
            pp=object[property];
            value = jQuery.toJSON(pp);
            if (value !== undefined) results.push(property + ':' + value);
          }
          return '{' + results.join(', ') + '}';
        }catch(e){
          alert(property+":"+value+"\n"+results.join(','));
        }
        break;
      case 'array':
        var results = [];
        if(object.length>0){
          for(var i = 0; i < object.length; i++) {
            var value = jQuery.toJSON(object[i]);
            if (value !== undefined) results.push(value);
          };
          return '[' + results.join(',') + ']';
        }
        else{
          for(k in object) {
            var kk=k;
            var value = jQuery.toJSON(object[k]);
            if (value !== undefined) results.push(kk+":"+value);
          }
          return '{' + results.join(',') + '}';
        }
        break;
    }
  }
});















/*  尝试去把ajax写成自己熟悉的调用方法
 **/

var ajax = {
  url: '',
  type: "POST",
  timeout: 10000,
  async: true,
  beforeSend:function(XMLHttpRequest){
  //alert("beforeSend");
  },
  cache:true,
  global:true,
  ifModified:false,
  processData:true,
  contentType: "application/x-www-form-urlencoded",
  //contentType: "application/json",
  data:"",
  dataType:"json",
  callback:"",
  complete:function(XMLHttpRequest,textStatus){
  //alert("complete");
  },

  error:function(XMLHttpRequest,textStatus,errorThrown){
  //alert("error");
  },

  success:function(obj,textStatus){
    //alert("success");
    this.callback(obj);
  },
  send:function(url,data,callback){
    this.url = url;
    this.data = data;
    this.callback = callback;
    $.ajax(this);
  },
  sendForm:function(form,callback){
    var params = $("#"+form).serialize();
    var url = $("#"+form).attr("action");
    this.send(url,params,callback);
  }
};



/*
var ajax = {
  url: '?',//(默认: 当前页地址) 发送请求的地址。
  type: "GET",//(默认: "GET") 请求方式 ("POST" 或 "GET")， 默认为 "GET"。
  timeout: 10000,//设置请求超时时间（毫秒）。此设置将覆盖全局设置。
  async: true,//(默认: true) 默认设置下，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为 false。注意，同步请求将锁住浏览器，用户其它操作必须等待请求完成才可以执行。
  beforeSend:function(XMLHttpRequest){
    //发送请求前可修改 XMLHttpRequest 对象的函数，如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。
  },
  cache:true,//(默认: true) jQuery 1.2 新功能，设置为 false 将不会从浏览器缓存中加载请求信息。
  complete:function(XMLHttpRequest,textStatus){
    //请求完成后回调函数 (请求成功或失败时均调用)。参数： XMLHttpRequest 对象，成功信息字符串。
  },
  contentType: "application/x-www-form-urlencoded",//(默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。
  data:"",//发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组，jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。
  dataType:"json",
   //预期服务器返回的数据类型。如果不指定，jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText，并作为回调函数参数传递，可用值:
   //"xml": 返回 XML 文档，可用 jQuery 处理。
   //"html": 返回纯文本 HTML 信息；包含 script 元素。
   //"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。
   //"json": 返回 JSON 数据 。
   //"jsonp": JSONP 格式。使用 JSONP 形式调用函数时，如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名，以执行回调函数。

  error:function(XMLHttpRequest,textStatus,errorThrown){
    //(默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数：XMLHttpRequest 对象，错误信息，（可能）捕获的错误对象。
  },
  global:true,//(默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件，如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件
  ifModified:false,//(默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。
  processData:true,//(默认: true) 默认情况下，发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息，请设置为 false。
  success:function(data,textStatus){
    //请求成功后回调函数。这个方法有两个参数：服务器返回数据，返回状态
  }
};
*/


/*  把传入的信息打印出屏幕，如果参数是json格式的就进行转换
 *  传多少个参数都可以
 ***/
function debug(){
  var rt = ''
  for (var i = 0; i < arguments.length; i++) {
    var msg = arguments[i]
    if (typeof msg != 'string' && typeof msg != 'number' && typeof msg != 'undefined' && typeof msg != 'boolean') rt += $.toJSON(msg) + "    ";
    else rt += msg + "     ";
  }
  alert(rt);
}

function replaceHtml(el, html) {
  var oldEl = typeof el === "string" ? $("#" + el)[0] : el;
  /*@cc_on // Pure innerHTML is slightly faster in IE
        oldEl.innerHTML = html;
        return oldEl;
    @*/
  var newEl = oldEl.cloneNode(false);
  newEl.innerHTML = html;
  oldEl.parentNode.replaceChild(newEl, oldEl);
  /* Since we just removed the old element from the DOM, return a reference
    to the new element, which can be used to restore variable references. */
  return newEl;
}

//__foot.html(1,1,1,1);
var __foot = {
  url:'',
  page:0,
  size:0,
  count:0,
  pages:0,
  jumpPage:1,
  data:'',
  dataType:"json",
  callback:"",
  html:function(page,size,count,callback){
    this.page = page;
    this.size = size;
    this.count = count;
    this.callback = callback;
    this.pages = Math.floor((count-1)/size)+1;
    var html = '<div>\n\
               '+this.count+' 条记录，第 '+this.page+'/'+this.pages+' 页\n\
               <a href="javascript:void(0)" onclick="__foot.onClickEvent(1)">首页</a>\n\
               <a href="javascript:void(0)" onclick="__foot.onClickEvent('+((this.page*1-1<1)?1:this.page*1-1)+')">前一页</a>\n\
               <a href="javascript:void(0)" onclick="__foot.onClickEvent('+(this.page*1+1>this.pages?this.pages:this.page*1+1)+')">后一页</a>\n\
               <a href="javascript:void(0)" onclick="__foot.onClickEvent('+this.pages+')">末页</a>\n\
               <input type="text" style="width:50px" value="" onchange="__foot.onChangeEvent(this)" />&nbsp;\n\
               <a href="javascript:void(0)" onclick="__foot.onClickJumpEvent()">跳转</a>\n\
               </div>';
    return html;
  },
  onClickEvent:function(page){
    this.page = page;
    this.callback(page);
  },
  onChangeEvent:function(self){
    var jp = $(self).val();
    if (jp <= 0) jp = 1;
    else if (jp > this.pages) jp = this.pages;
    this.jumpPage = jp;
  },
  onClickJumpEvent:function(){
    this.callback(this.jumpPage);
  }
};



//function getHTMLFooter(count,size,page) {
//  var pages=Math.floor((count-1)/size)+1;
//  var html='<table id="tblFooter" border="0" cellpadding="0" cellspacing="1"  class="main_table"><tr class = "main_table_even"><td align="center">'+
//  jsI18N.PagingFooterRecordPrefix+count+jsI18N.PagingFooterRecord+'&nbsp;&nbsp;&nbsp;'+
//  jsI18N.PagingFooterPagePrefix+page+'/'+pages+jsI18N.PagingFooterPage+'&nbsp;&nbsp;&nbsp;'+
//  '<a href="javascript:void(0)" class = "link1">'+jsI18N.PagingFooterPageFirst+'</a>&nbsp;&nbsp;'+
//  '<a href="javascript:void(0)" class = "link1">'+jsI18N.PagingFooterPagePrev+'</a>&nbsp;&nbsp;'+
//  '<a href="javascript:void(0)" class = "link1">'+jsI18N.PagingFooterPageNext+'</a>&nbsp;&nbsp;'+
//  '<a href="javascript:void(0)" class = "link1">'+jsI18N.PagingFooterPageLast+'</a>&nbsp;&nbsp;'+
//  '<a id="lnkFooterJump" href="javascript:void(0)" class = "link1">'+jsI18N.PagingFooterPageJump+'</a>'+
//  '</td></tr></table>';
//  return html;
//}
//
///** 给分页链接加上事件，需要页面上已经有分页链接和txtHiddenPage*/
//function addEventFooter(pages,callback) {
//  $("#lnkFooterFirst").click(function(){
//    if ($("#txtHiddenPage").val()!=1) {
//      $("#txtHiddenPage").val(1);
//      callback();
//    }
//  });
//  $("#lnkFooterPrev").click(function(){
//    if ($("#txtHiddenPage").val()!=1) {
//      $("#txtHiddenPage").val($("#txtHiddenPage").val()-1);
//      callback();
//    }
//  });
//  $("#lnkFooterNext").click(function(){
//    if ($("#txtHiddenPage").val()!=pages) {
//      $("#txtHiddenPage").val(1*$("#txtHiddenPage").val()+1);
//      callback();
//    }
//  });
//  $("#lnkFooterLast").click(function(){
//    if ($("#txtHiddenPage").val()!=pages) {
//      $("#txtHiddenPage").val(pages);
//      callback();
//    }
//  });
//  $("#lnkFooterJump").click(function(){
//    if ($("#txtJump").val()>0) {
//      $("#txtHiddenPage").val($("#txtJump").val());
//      callback();
//    }
//  });
//}